﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace TP2.Lib
{
     [Serializable]
    public class MovimientoCircular : TrayectoriaAbstracta
    {
        #region /*------- Propiedades ---------*/

        private double _radioDeGiro;
        public double RadioDeGiro
        {
            get { return this._radioDeGiro; }
            set { this._radioDeGiro = value; }
        }

        private double _omega;
        public double Omega
        {
            get {return this._omega;}
            set { this._omega = value; }
        }

        private double _anguloActual;
        public double AnguloActual
        {
            get { return this._anguloActual; }
            set { this._anguloActual = value; }
        }

        private double[] _centro = new double[3];
        public double[] Centro
        {
            get { return this._centro; }
            set { this._centro = value; }
        }

        #endregion

        private MovimientoCircular() { } /*Constructor vacio, utilizado solo por el serializador*/
        
        public MovimientoCircular(int[] dimensiones, double radioDeGiro, ElementoJuego elemento)
        {
            this.RadioDeGiro = radioDeGiro;
            this.AnguloActual = 180;
            this.CalcularComponentes(dimensiones, elemento);
        }

        public MovimientoCircular(int[] dimensiones, ElementoJuego elemento)
        {
            this.AnguloActual = 0;
            this.CalcularComponentes(dimensiones, elemento);
        }

        public override double[] GetSiguientePunto(double[] posicion)
        {
            double[] posicionNueva = new double[3];
            double alfaNuevo;
            double CosAlfaNuevo;
            alfaNuevo = this.AnguloActual + this.Omega;
            CosAlfaNuevo = Math.Cos(alfaNuevo);

            posicionNueva[0] = (this.Centro[0]) + ((this.RadioDeGiro) * Math.Cos(alfaNuevo));
            posicionNueva[1] = (this.Centro[1]) + ((this.RadioDeGiro) * Math.Sin(alfaNuevo));

            this.AnguloActual = alfaNuevo;
            return (posicionNueva);

        }

        #region /*-------Metodos privados --------*/

        private void CalcularComponentes(int[] dimensiones, ElementoJuego elemento)
        {
            double radioDeGiro;
            double omega;
            double[] medio = new double[3];
            //Calcula el centro de donde va a ejecutarse el movimiento circular
            medio[0] = dimensiones[0] / 2;
            medio[1] = dimensiones[1] / 2;
            this.Centro = medio;


            if (dimensiones[0] >= dimensiones[1])
            {
                radioDeGiro = (dimensiones[1]/2) - elemento.Radio;
                
                this.RadioDeGiro = radioDeGiro;
            }
            else
            {
                radioDeGiro = (dimensiones[0] / 2) - elemento.Radio;
                this.RadioDeGiro = radioDeGiro;
            }

            //Calculo el Omega = V/R par luego setearlo
            omega = (elemento.Rapidez) / (this.RadioDeGiro);
            this.Omega = omega;
        }

        private void CalcularComponentes(int[] dimensiones, ElementoJuego elemento, double radioDeGiro)
        {
            double omega;
            double[] medio = new double[3];
            //Calcula el centro de donde va a ejecutarse el movimiento circular
            medio[0] = dimensiones[0] / 2;
            medio[1] = dimensiones[1] / 2;
            this.Centro = medio;
            this.RadioDeGiro = radioDeGiro;

            //Calculo el Omega = V/R par luego setearlo
            omega = (elemento.Rapidez) / (this.RadioDeGiro);
            this.Omega = omega;
        }

        #endregion

    }
}
